package com.witsight.platform.util.tools;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**   
 * 说明：Spring取得对象的工具类
 * @Title: SpringUtil.java 
 * @Package com.witsight.platform.util.tools 
 * @See: {@link ApplicationContextAware}
 * Copyright: Copyright (c) 2017
 * Company:sany huax witsight team by product
 * @author: penght  
 * @date: 2017年9月11日 下午3:20:49 
 * @version: V1.0
 *
 */
public class SpringUtil implements ApplicationContextAware {
	/**
	 * 说明：定义后能再同一类中使用static常量log
	 */
	private static final Logger logger = LoggerFactory.getLogger(SpringUtil.class);
	/**
	 * 说明：定义一个只能在该类使用的静态变量applicationContext
	 */
	private static ApplicationContext applicationContext;
	/**
	 * (non-Javadoc)
	 * @Title: setApplicationContext
	 * @See: 实现ApplicationContextAware接口的回调方法，设置上下文环境
	 * @author penght
	 * @param applicationContext 应用前后关系
	 * @throws BeansException bean异常
	 * @date: 2016年4月28日 上午11:57:28
	 */
	public final void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		SpringUtil.applicationContext = applicationContext;
	}
	
	/**
	 * 说明：通过Spring配置文件中定义的bean名称，从IOC容器中取得实例
	 * @Title: getBean
	 * @See:
	 * @author penght
	 * @param beanName Bean名
	 * @param <T> 范型
	 * @return Bean名称对应实例Object，使用时需要强制类型转换
	 * @date: 2016年4月28日 下午12:00:49
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(String beanName) {
		try {
			T bean = (T) applicationContext.getBean(beanName);
			return bean;
		} catch (Exception e){
			if (logger.isDebugEnabled()) {
				logger.debug("bean's name of Spring config's file don't exist,error message :",e);
			}
		}
		return null;
	}
	
	/**
	 * 说明：通过Spring配置文件中定义的bean名称，从IOC容器中取得bean类型
	 * @Title: getType
	 * @See:
	 * @author Liu Yutang
	 * @param beanName Bean名
	 * @return Bean名称对应bean类型
	 * @date: 2016年12月18日上午09:40:49
	 */
	public static Class<?> getType(String beanName) {
		try {
			Class<?> beanType = applicationContext.getType(beanName);
			return beanType;
		} catch (Exception e){
			if (logger.isDebugEnabled()) {
				logger.debug("bean's name of Spring config's file don't exist,error message :",e);
			}
		}
		return null;
	}

	/**
	 * 说明：获取指定类型的Bean
	 * @Title: getBeansByType
	 * @See:
	 * @author penght
	 * @param beanType Bean类名
	 * @return 指定类型的Bean
	 * @date: 2016年4月28日 下午12:55:31
	 */
	@SuppressWarnings({"rawtypes" ,"unchecked"})
	public static <T> Map<String, T> getBeansByType(Class beanType) {
		try {
			Map<String, T> beans = applicationContext.getBeansOfType(beanType);
			return beans;
		} catch (Exception e){
			if (logger.isDebugEnabled()) {
				logger.debug("bean of  Obtained type don't exist, error message:",e);
			}
		}
		return null;
	}

	/**
	 * 说明：获取指定类型的Bean映射到MAP
	 * @Title: getBeanByType
	 * @See:
	 * @author penght
	 * @param beanType bean类
	 * @param <T> 范型
	 * @return 映射结果
	 * @date: 2016年4月28日 下午1:02:16
	 */
	public static <T> T getBeanByType(Class<T> beanType) {		
		try {
			Map<String, T> beans = SpringUtil.applicationContext.getBeansOfType(beanType);
			if (beans != null && beans.size() > 0) {
				return beans.values().iterator().next();
			}
		} catch (Exception e){
			if (logger.isDebugEnabled()) {
				logger.debug("bean of  Obtained type don't exist in Map, error message:",e);
			}
		}
		return null;
	}
}
